home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / sndhrdw / redalert.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  3KB  |  121 lines

  1. /***************************************************************************
  2.  
  3. Irem Red Alert sound hardware
  4.  
  5. The manual lists two sets of sounds.
  6.  
  7. Analogue:
  8. - Formation Aircraft
  9. - Dive bombers
  10. - Helicopters
  11. - Launcher firing
  12. - Explosion #1
  13. - Explosion #2
  14. - Explosion #3
  15.  
  16. Digital:
  17. - Melody #1.  Starting sound.
  18. - Melody #2.  Ending sound
  19. - Time signal
  20. - Chirping birds
  21. - Alarm
  22. - Excellent
  23. - Coin insertion
  24. - MIRV division
  25. - Megaton bomb - long
  26. - Megaton bomb - short
  27. - Megaton bomb landing
  28.  
  29. If you have any questions about how this driver works, don't hesitate to
  30. ask.  - Mike Balfour (mab22@po.cwru.edu)
  31. ***************************************************************************/
  32.  
  33. #include "driver.h"
  34. #include "cpu/m6502/m6502.h"
  35. #include "cpu/i8085/i8085.h"
  36.  
  37. static int AY8910_A_input_data = 0;
  38. static int c030_data = 0;
  39. static int sound_register_IC1 = 0;
  40. static int sound_register_IC2 = 0;
  41.  
  42. WRITE_HANDLER( redalert_c030_w )
  43. {
  44.     c030_data = data & 0x3F;
  45.  
  46.     /* Is this some type of sound command? */
  47.     if (data & 0x80)
  48.         /* Cause an NMI on the voice CPU here? */
  49.         cpu_cause_interrupt(2,I8085_RST75);
  50. }
  51.  
  52. READ_HANDLER( redalert_voicecommand_r )
  53. {
  54.     return c030_data;
  55. }
  56.  
  57. WRITE_HANDLER( redalert_soundlatch_w )
  58. {
  59.     /* The byte is connected to Port A of the AY8910 */
  60.     AY8910_A_input_data = data;
  61.  
  62.     /* Bit D7 is also connected to the NMI input of the CPU */
  63.     if ((data & 0x80)!=0x80)
  64.         cpu_cause_interrupt(1,M6502_INT_NMI);
  65. }
  66.  
  67. READ_HANDLER( redalert_AY8910_A_r )
  68. {
  69.     return AY8910_A_input_data;
  70. }
  71.  
  72. WRITE_HANDLER( redalert_AY8910_w )
  73. {
  74.     /* BC2 is connected to a pull-up resistor, so BC2=1 always */
  75.     switch (data)
  76.     {
  77.         case 0x00:
  78.             /* BC1=0, BDIR=0 : INACTIVE */
  79.             break;
  80.         case 0x01:
  81.             /* BC1=1, BDIR=0 : READ FROM PSG */
  82.             sound_register_IC1 = AY8910_read_port_0_r(offset);
  83.             break;
  84.         case 0x02:
  85.             /* BC1=0, BDIR=1 : WRITE TO PSG */
  86.             AY8910_write_port_0_w(offset,sound_register_IC2);
  87.             break;
  88.         case 0x03:
  89.             /* BC1=1, BDIR=1 : LATCH ADDRESS */
  90.             AY8910_control_port_0_w(offset,sound_register_IC2);
  91.             break;
  92.         default:
  93.             logerror("Invalid Sound Command: %02X\n",data);
  94.             break;
  95.     }
  96. }
  97.  
  98. READ_HANDLER( redalert_sound_register_IC1_r )
  99. {
  100.     return sound_register_IC1;
  101. }
  102.  
  103. WRITE_HANDLER( redalert_sound_register_IC2_w )
  104. {
  105.     sound_register_IC2 = data;
  106. }
  107.  
  108. WRITE_HANDLER( redalert_AY8910_B_w )
  109. {
  110.     /* I'm fairly certain this port triggers analog sounds */
  111.     logerror("Port B Trigger: %02X\n",data);
  112.     /* D0 = Formation Aircraft? */
  113.     /* D1 = Dive bombers? */
  114.     /* D2 = Helicopters? */
  115.     /* D3 = Launcher firing? */
  116.     /* D4 = Explosion #1? */
  117.     /* D5 = Explosion #2? */
  118.     /* D6 = Explosion #3? */
  119. }
  120.  
  121.